package gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JLabel;
import javax.swing.JPanel;

import logica.Catre;
import logica.Celula;
import logica.Espaco;
import entidades.Ambiente;
import entidades.Demolidor;
import entidades.Electra;

public class AmbienteGrafico extends JPanel {
	private static final long serialVersionUID = 1L;

	private static int TAMANHO_CELULA = 80;
	private static int OFFSET = 5;
	private Ambiente ambiente;

	AmbienteGrafico (Ambiente ambiente) {
		this.setAmbiente(ambiente);
	}

	public Ambiente getAmbiente() {
		return ambiente;
	}

	public void setAmbiente(Ambiente ambiente) {
		this.ambiente = ambiente;
	}

	public void paintComponent(Graphics g)	{
		super.paintComponent(g);
		setBackground(Color.black);

		desenhaAmbiente(g);
		desenhaDemolidor(g);
		desenhaElectra(g);
	}

	private void desenhaDemolidor(Graphics g) {
		Demolidor demolidor = getAmbiente().getDemolidor();
		int x = demolidor.getPosicao().getX();
		int y = demolidor.getPosicao().getY();
		if (!demolidor.isVivo())
			desenhaCelulaDemolidor(x, y, imagemDemolidorMorto());
		else if (demolidorEncontouElectra())
			desenhaCelulaDemolidor(x, y, imagemEncontro());
		else desenhaCelulaDemolidor(x, y, imagemDirecionadaDemolidor());
	}

	private boolean demolidorEncontouElectra() {
		return getAmbiente().getDemolidor().getPosicao().equals(getAmbiente().getElectra().getPosicao());
	}

	private String imagemDirecionadaDemolidor() {
		return "demolidor_" + getAmbiente().getDemolidor().getDirecao() + ".png";
	}

	private String imagemEncontro() {
		return "encontro.png";
	}

	private String imagemDemolidorMorto() {
		return "demolidor_MORTE.png";
	}

	private String imagemDirecionadaElectra() {
		return "electra_" + getAmbiente().getElectra().getDirecao() + ".png";
	}

	private void desenhaElectra(Graphics g) {
		Electra electra = getAmbiente().getElectra();
		int x = electra.getPosicao().getX();
		int y = electra.getPosicao().getY();
		desenhaCelula(x, y, imagemDirecionadaElectra());
	}

	private void desenhaAmbiente(Graphics g) {
		for (int coluna = 0; coluna < 6; coluna++) {
			for (int linha = 0; linha < 5; linha++) {
				if (!ehPosicaoDoDemolidor(linha, coluna) && !ehPosicaoDeElectra(linha, coluna)){
					desenhaCelula(linha, coluna, null);
				}
			}
		}
	}

	private boolean ehPosicaoDoDemolidor(int j, int i) {
		return ((getAmbiente().getDemolidor().getPosicao().getX() == j) && (getAmbiente().getDemolidor().getPosicao().getY() == i));
	}

	private boolean ehPosicaoDeElectra(int coluna, int linha) {
		return ((getAmbiente().getElectra().getPosicao().getX() == coluna) && (getAmbiente().getElectra().getPosicao().getY() == linha));
	}

	private void desenhaCelula(int coluna, int linha, String imgName){
		Celula celula = getAmbiente().getMatriz()[coluna][linha];
		if (celula instanceof Espaco) {
		    this.add(createAmbientePanel(coluna, linha, Color.white, imgName));

		} else {
			if (!((Catre)celula).isQuebrado())
				this.add(createAmbientePanel(coluna, linha, Color.darkGray, imgName));
			else this.add(createAmbientePanel(coluna, linha, Color.lightGray, imgName));
		}
	}

	private void desenhaCelulaDemolidor(int coluna, int linha, String imgName){
		Celula celula = getAmbiente().getMatriz()[coluna][linha];
		if (celula instanceof Espaco) {
		    this.add(createAmbientePanel(coluna, linha, Color.white, imgName));

		} else {
			((Catre)celula).setQuebrado(true);
		    this.add(createAmbientePanel(coluna, linha, Color.lightGray, imgName));
		}
	}

	public void restauraCatres() {
		for (int i = 0; i < 5; i++){
			for (int j = 0; j < 6; j++){
				Celula celula = getAmbiente().getMatriz()[i][j];
				if (celula instanceof Catre) {
					((Catre)celula).setQuebrado(false);
				}
			}
		}
	}

	private JPanel createAmbientePanel(int coluna, int linha, Color cor, String imgName) {
		BackgroundPanel jPanel = new BackgroundPanel(imgName);
		JLabel labelPeso = new JLabel();
		//Este label representa o "modo debug" =)
		labelPeso.setBounds(0, 0, 20, 20);
		labelPeso.setForeground(Color.red);
		labelPeso.setText(coluna + "," + linha);
		labelPeso.setOpaque(false);
		jPanel.add(labelPeso);
		
		//((BackgroundPanel)jPanel).rotate(360);
		jPanel.setName("bloco" + coluna + "" + linha);
		jPanel.setPreferredSize(new Dimension(0,0));
	    jPanel.setLayout(null);
	    jPanel.setBackground(cor);
	    jPanel.setBounds((OFFSET * (linha + 1)) + (TAMANHO_CELULA * linha), (OFFSET * (coluna + 1)) + (TAMANHO_CELULA * coluna),TAMANHO_CELULA,TAMANHO_CELULA);
	    //jPanel.setImage();
	    return jPanel;
	}

}
